package com.project.springboot.id;

/**
 * description: 唯一主键生成器
 * @author 朱正磊
 * @date 2023-09-27 16:59:16
 */
public class UniqueTimestamp {

    private char precision = 'S';

    private long ts = -1L;

    public UniqueTimestamp() {

    }

    public UniqueTimestamp(char prec) {
        if ((prec != 'S') && (prec != 's') && (prec != 'm')) {
            throw new IllegalArgumentException("Illegal argument for UniqueTimestamp. Only 'S', 's','m' can be used.");
        }
        this.precision = prec;
    }

    public synchronized long getUniqueTimestamp() {
        if (this.ts == -1L) {
            this.ts = getCurrentTimeValue();
        } else {
            long t = getCurrentTimeValue();
            if (t <= this.ts) {
                this.ts += 1L;
            } else {
                this.ts = t;
            }
        }
        return getReturnValue(this.ts);
    }

    private long getCurrentTimeValue() {
        long ts;
        switch (this.precision) {
            case 'S':
            default:
                ts = System.currentTimeMillis();
                break;
            case 's':
                ts = System.currentTimeMillis() / 1000L;
                break;
            case 'm':
                ts = System.currentTimeMillis() / 60000L;
        }
        return ts;
    }

    private long getReturnValue(long ts) {
        switch (this.precision) {
            case 'S':
            default:
                return ts;
            case 's':
                return ts * 1000L;
        }
    }

}
